﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using CMISLibrary.Entities;
using CMISLibrary;
using BCNPCObject.DB;

namespace BCNPCObject
{
    public class cls_THONGTIN_KHANG_Controller
    {
        public DataSet Get_THONGTIN_KHANG_sogcs(string strMa_dviqly, string strMa_sogcs, ref string strErr)
        {
            try
            {
                var qddosogcs = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && p.MA_SOGCS == strMa_sogcs
                                 //&& p.NGAY_HLUC == CMIS2.DB.HDG_DDO_SOGCS.Where(c=> c.MA_DDO == p.MA_DDO).Max(c2=> c2.NGAY_HLUC)
                                 select new
                                 {
                                     p.MA_DVIQLY, // = pgroup.Key.MA_DVIQLY,
                                     p.MA_DDO,  // = pgroup.Key.MA_DDO,
                                     p.MA_SOGCS,  // = pgroup.Key.MA_SOGCS,
                                     p.STT,
                                     p.NGAY_HLUC,
                                     p.ID_QHE
                                 }).ToList();
                if (qddosogcs.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                string[] ArrDDO = qddosogcs.Select(c => c.MA_DDO).Distinct().ToArray();

                var DDOinHDG_DDO_SOGCS = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                          where p.MA_DVIQLY == strMa_dviqly
                                          && ArrDDO.Contains(p.MA_DDO)
                                          select p).ToList();

                var DDOMaxHL = (DDOinHDG_DDO_SOGCS.Where(c => c.NGAY_HLUC == DDOinHDG_DDO_SOGCS.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();

                //danh sach diem do hien tai thuoc so                               
                var DDDOSOGCS = (from p in DDOMaxHL
                                 where p.MA_SOGCS == strMa_sogcs
                                 select p).ToList();

                string[] ArrMADDO = DDDOSOGCS.Select(c => c.MA_DDO).Distinct().ToArray();

                if (ArrMADDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                //var nl = ArrMADDO.AsEnumerable();

                var DIEMDO = (from p in CMIS2.DB.HDG_DIEM_DO
                              where p.MA_DVIQLY == strMa_dviqly
                              && ArrMADDO.Contains(p.MA_DDO)
                              select new
                              {
                                  p.MA_DVIQLY,
                                  p.MA_DDO,
                                  p.ID_HDONG,
                                  p.MA_KHANG,
                                  p.MA_DDO_DDIEN,
                                  p.MA_CAPDA,
                                  p.DIA_CHI,
                                  p.ID_DIA_CHINH,
                                  p.KIMUA_CSPK,
                                  p.CSUAT,
                                  p.MUC_DICH,
                                  p.SO_PHA,
                                  p.SOHUU_LUOI,
                                  p.LOAI_DDO,
                                  p.SO_HO,
                                  p.LAN_CAPNHAT,
                                  p.THAO_TACDL,
                                  p.NGAY_HLUC,
                                  p.MO_TA,
                                  p.TRANG_THAI,
                                  p.TTRANG_TREOTHAO,
                                  p.NGAY_TAO,
                                  p.NGUOI_TAO,
                                  p.NGAY_SUA,
                                  p.NGUOI_SUA,
                                  p.MA_CNANG
                              }).ToList();

                if (DIEMDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                var DIEMDOMaxHL1 = (DIEMDO.Where(c => c.NGAY_HLUC == DIEMDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();

                var DIEMDOMaxHL = (DIEMDOMaxHL1.Where(c => c.LAN_CAPNHAT == DIEMDOMaxHL1.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.LAN_CAPNHAT))).ToList();
                if (DIEMDOMaxHL.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }


                var VTDDO = (from p in CMIS2.DB.HDG_VITRI_DDO
                             where p.MA_DVIQLY == strMa_dviqly
                             && ArrMADDO.Contains(p.MA_DDO)
                             select new
                             {
                                 p.MA_DVIQLY,
                                 p.ID_VITRI_DDO,
                                 p.NGAY_HLUC,
                                 p.MA_DDO,
                                 p.MA_TRAM,
                                 p.MA_LO,
                                 p.MA_TO,
                                 p.PHA,
                                 p.SO_COT,
                                 p.SO_HOM,
                                 p.NGAY_TAO,
                                 p.NGUOI_TAO,
                                 p.NGAY_SUA,
                                 p.NGUOI_SUA,
                                 p.MA_CNANG
                             }).ToList();

                var VTDDOMaxHL = (VTDDO.Where(c => c.NGAY_HLUC == VTDDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();
                if (VTDDOMaxHL.Count() < 1) { strErr = "Không lấy được vị trí điểm đo"; return null; }


                string[] ArrMAKHANG = DIEMDOMaxHL.Select(c => c.MA_KHANG).Distinct().ToArray();
                if (ArrMAKHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANG = (from p in CMIS2.DB.HDG_KHACH_HANG
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && ArrMAKHANG.Contains(p.MA_KHANG)
                                 select new
                                 {
                                     p.MA_DVIQLY,
                                     p.MA_KHANG,
                                     p.SO_NHA,
                                     p.DUONG_PHO,
                                     p.DCHI_HDON,
                                     p.ID_HDONG,
                                     p.MASO_THUE,
                                     p.TLE_THUE,
                                     p.LOAI_KHANG,
                                     p.MANHOM_KHANG,
                                     p.MA_NN,
                                     p.TEN_KHANG,
                                     p.TENHDON_KHANG,
                                     p.TENTAT_KHANG,
                                     p.NGAY_SINH,
                                     p.NGAY_HLUC,
                                     p.TRANG_THAI,
                                     p.THANG,
                                     p.NAM,
                                     p.MA_DVIDCHINH,
                                     p.TKHOAN_KHANG,
                                     p.MA_NHANG,
                                     p.MA_KHTT,
                                     p.MA_LOAIDN,
                                     p.DTHOAI,
                                     p.FAX,
                                     p.EMAIL,
                                     p.WEBSITE,
                                     p.GIOI_TINH,
                                     p.NGAY_TAO,
                                     p.NGUOI_TAO,
                                     p.NGAY_SUA,
                                     p.NGUOI_SUA,
                                     p.MA_CNANG
                                 }).ToList();
                if (KHACHHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANGMaxHL = (KHACHHANG.Where(c => c.NGAY_HLUC == KHACHHANG.Where(c2 => c2.MA_KHANG == c.MA_KHANG).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();
                if (KHACHHANGMaxHL.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                long[] ArrIDHDONG = KHACHHANGMaxHL.Select(c => c.ID_HDONG).ToArray();

                var HOPDONG = (from p in CMIS2.DB.HDG_HOP_DONG
                               where p.MA_DVIQLY == strMa_dviqly
                               && ArrIDHDONG.Contains(p.ID_HDONG)
                               select p).ToList();

                var HOPDONGMaxHL = (HOPDONG.Where(c => c.NGAY_HLUC == HOPDONG.Where(a => a.ID_HDONG == c.ID_HDONG).Max(s => s.NGAY_HLUC))).ToList();
                if (HOPDONGMaxHL.Count() < 1) { strErr = "Không lấy được thông tin hợp đồng"; return null; }

                var joi1 = (from p in DDDOSOGCS
                            join m in DIEMDOMaxHL
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.STT,
                                p.MA_DVIQLY,
                                p.MA_DDO,
                                m.MA_KHANG,
                                m.DIA_CHI,
                                m.NGAY_HLUC
                            }).ToList();


                var joi2 = (from p in joi1
                            join m in VTDDOMaxHL
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.STT,
                                p.MA_DVIQLY,
                                p.MA_DDO,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.NGAY_HLUC,
                                m.MA_LO,
                                m.MA_TO,
                                m.SO_COT,
                                m.SO_HOM
                            }).ToList();

                var joi3 = (from p in joi2
                            join m in KHACHHANGMaxHL
                            on new { p.MA_KHANG } equals new { m.MA_KHANG }
                            orderby p.STT
                            select new
                            {
                                CHON = false,
                                p.STT,
                                p.MA_DVIQLY,
                                p.MA_DDO,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                NGAY_HLUC = p.NGAY_HLUC.ToString("dd/MM/yyyy"),
                                p.MA_LO,
                                p.MA_TO,
                                p.SO_COT,
                                p.SO_HOM,
                                m.DUONG_PHO,
                                m.DCHI_HDON,
                                m.DTHOAI,
                                m.EMAIL,
                                m.TEN_KHANG
                            }).ToList();





                /*
                var joi7 = (from p in joi5
                            join m in CTO
                            on new { p.MA_DVIQLY, p.MA_CTO } equals new { m.MA_DVIQLY, m.MA_CTO }
                            orderby p.STT
                            select new
                            {
                                CHON = false,
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                KY = p.KY.ToString(),
                                THANG = p.THANG.ToString(),
                                NAM = p.NAM.ToString(),
                                p.CHISO_MOI,
                                p.CHISO_CU,
                                p.LOAI_CHISO,
                                p.BCS,
                                p.HS_NHAN,
                                p.MA_CTO,
                                p.SO_CTO,
                                p.MA_LO,
                                p.MA_TO,
                                p.MA_TRAM,
                                PHA = p.SO_PHA.ToString(),
                                CSUAT_DDO = p.CSUAT.ToString(),
                                p.SO_COT,
                                p.SO_HOM,
                                HSN = p.HS_NHAN,
                                PHA_ABCD = p.PHA,
                                MA_NHOMNN = p.MA_NN,
                                m.MA_CLOAI,
                                m.NAM_SX,
                                m.LOAI_SOHUU,
                                NGAY_BDONG = m.NGAY_BDONG == null ? null : m.NGAY_BDONG.Value.ToString("dd/MM/yyyy"),
                                HAN_KDINH = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HAN_KDINH).FirstOrDefault(),
                                NGAY_KDINH = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault(),
                                MA_NUOC = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.MA_NUOC).FirstOrDefault(),
                                SO_CSO = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.SO_CSO).FirstOrDefault(),
                                DONG_DIEN = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.DONG_DIEN).FirstOrDefault(),
                                HANGSO_K = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HANGSO_K).FirstOrDefault() == null ? null : HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HANGSO_K).FirstOrDefault(),
                                TEN_TO = TO.Where(c => c.MA_TO == p.MA_TO).Select(c2 => c2.TEN_TO).FirstOrDefault(),
                                TEN_LO = LO.Where(c => c.MA_LO == p.MA_LO).Select(c2 => c2.TEN_LO).FirstOrDefault(),
                                TEN_TRAM = TRAM.Where(c => c.MA_TRAM == p.MA_TRAM).Select(c2 => c2.TEN_TRAM).FirstOrDefault(),
                                CSUAT_TRAM = TRAM.Where(c => c.MA_TRAM == p.MA_TRAM).Select(c2 => c2.CSUAT_TRAM).FirstOrDefault().ToString(),
                                MA_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.MA_HDONG).FirstOrDefault(),
                                NGAYKY_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault() == null ? null : HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault().Value.ToString("dd/MM/yyyy"),
                                CAP_DAP = CAPDAP.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.TEN_CAPDA).FirstOrDefault(),
                                TYSO_TU = TUmaxID == null ? null : (TUmaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault() == null ? null : TUmaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault()),
                                NGAY_KDINH_TU = TUKdinh == null ? null : (TUKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault() == null ? null : TUKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault().Value.ToString("dd/MM/yyyy")),
                                TYSO_TI = TImaxID == null ? null : (TImaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault() == null ? null : TImaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault()),
                                NGAY_KDINH_TI = TIKdinh == null ? null : (TIKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault() == null ? null : TIKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault().Value.ToString("dd/MM/yyyy"))

                            }).ToList();

                */


                if (joi3.Count > 0)
                {
                    DataTable dt = Utility.LINQToDataTable(joi3);
                    dt.TableName = "KQ";
                    DataSet ds = new DataSet();
                    ds.Tables.Add(dt);

                    DataTable dtDDO = new DataTable();
                    DataTable dtVITRI = new DataTable();
                    DataTable dtKHANG = new DataTable();

                    if (DIEMDOMaxHL.Count > 0)
                    {
                        dtDDO = Utility.LINQToDataTable(DIEMDOMaxHL);
                        dtDDO.TableName = "DIEMDO";
                        ds.Tables.Add(dtDDO);
                    }

                    if (VTDDOMaxHL.Count > 0)
                    {
                        dtVITRI = Utility.LINQToDataTable(VTDDOMaxHL);
                        dtVITRI.TableName = "VITRI";
                        ds.Tables.Add(dtVITRI);
                    }

                    if (KHACHHANGMaxHL.Count > 0)
                    {
                        dtKHANG = Utility.LINQToDataTable(KHACHHANGMaxHL);
                        dtKHANG.TableName = "KHANG";
                        ds.Tables.Add(dtKHANG);
                    }

                    return ds;
                }
                return null;


            }
            catch (Exception ex)
            {
                if (ex.Message.ToString().Contains("ORA-01795"))
                {
                    strErr = "Số điểm đo của sổ lớn hơn 1000, không lấy được dữ liệu !";
                }
                else
                {
                    strErr = "Không lấy được dữ liệu \n" + ex.ToString();
                }
                return null;
            }
        }

        public DataSet Get_THONGTIN_KHANG_sogcs_SMS(string strMa_dviqly, string strMa_sogcs, ref string strErr)
        {
            try
            {
                var qddosogcs = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && p.MA_SOGCS == strMa_sogcs
                                 //&& p.NGAY_HLUC == CMIS2.DB.HDG_DDO_SOGCS.Where(c=> c.MA_DDO == p.MA_DDO).Max(c2=> c2.NGAY_HLUC)
                                 select new
                                 {
                                     p.MA_DVIQLY, // = pgroup.Key.MA_DVIQLY,
                                     p.MA_DDO,  // = pgroup.Key.MA_DDO,
                                     p.MA_SOGCS,  // = pgroup.Key.MA_SOGCS,
                                     p.STT,
                                     p.NGAY_HLUC,
                                     p.ID_QHE
                                 }).ToList();
                if (qddosogcs.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                string[] ArrDDO = qddosogcs.Select(c => c.MA_DDO).Distinct().ToArray();

                var DDOinHDG_DDO_SOGCS = (from p in CMIS2.DB.HDG_DDO_SOGCS
                                          where p.MA_DVIQLY == strMa_dviqly
                                          && ArrDDO.Contains(p.MA_DDO)
                                          select p).ToList();

                var DDOMaxHL = (DDOinHDG_DDO_SOGCS.Where(c => c.NGAY_HLUC == DDOinHDG_DDO_SOGCS.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();

                //danh sach diem do hien tai thuoc so                               
                var DDDOSOGCS = (from p in DDOMaxHL
                                 where p.MA_SOGCS == strMa_sogcs
                                 select p).ToList();

                string[] ArrMADDO = DDDOSOGCS.Select(c => c.MA_DDO).Distinct().ToArray();

                if (ArrMADDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                //var nl = ArrMADDO.AsEnumerable();

                var DIEMDO = (from p in CMIS2.DB.HDG_DIEM_DO
                              where p.MA_DVIQLY == strMa_dviqly
                              && ArrMADDO.Contains(p.MA_DDO)
                              select new
                              {
                                  p.MA_DVIQLY,
                                  p.MA_DDO,
                                  p.ID_HDONG,
                                  p.MA_KHANG,
                                  p.MA_DDO_DDIEN,
                                  p.MA_CAPDA,
                                  p.DIA_CHI,
                                  p.ID_DIA_CHINH,
                                  p.KIMUA_CSPK,
                                  p.CSUAT,
                                  p.MUC_DICH,
                                  p.SO_PHA,
                                  p.SOHUU_LUOI,
                                  p.LOAI_DDO,
                                  p.SO_HO,
                                  p.LAN_CAPNHAT,
                                  p.THAO_TACDL,
                                  p.NGAY_HLUC,
                                  p.MO_TA,
                                  p.TRANG_THAI,
                                  p.TTRANG_TREOTHAO,
                                  p.NGAY_TAO,
                                  p.NGUOI_TAO,
                                  p.NGAY_SUA,
                                  p.NGUOI_SUA,
                                  p.MA_CNANG
                              }).ToList();

                if (DIEMDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                var DIEMDOMaxHL1 = (DIEMDO.Where(c => c.NGAY_HLUC == DIEMDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();

                var DIEMDOMaxHL = (DIEMDOMaxHL1.Where(c => c.LAN_CAPNHAT == DIEMDOMaxHL1.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.LAN_CAPNHAT))).ToList();
                if (DIEMDOMaxHL.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }


                var VTDDO = (from p in CMIS2.DB.HDG_VITRI_DDO
                             where p.MA_DVIQLY == strMa_dviqly
                             && ArrMADDO.Contains(p.MA_DDO)
                             select new
                             {
                                 p.MA_DVIQLY,
                                 p.ID_VITRI_DDO,
                                 p.NGAY_HLUC,
                                 p.MA_DDO,
                                 p.MA_TRAM,
                                 p.MA_LO,
                                 p.MA_TO,
                                 p.PHA,
                                 p.SO_COT,
                                 p.SO_HOM,
                                 p.NGAY_TAO,
                                 p.NGUOI_TAO,
                                 p.NGAY_SUA,
                                 p.NGUOI_SUA,
                                 p.MA_CNANG
                             }).ToList();

                var VTDDOMaxHL = (VTDDO.Where(c => c.NGAY_HLUC == VTDDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();
                if (VTDDOMaxHL.Count() < 1) { strErr = "Không lấy được vị trí điểm đo"; return null; }


                string[] ArrMAKHANG = DIEMDOMaxHL.Select(c => c.MA_KHANG).Distinct().ToArray();
                if (ArrMAKHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANG = (from p in CMIS2.DB.HDG_KHACH_HANG
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && ArrMAKHANG.Contains(p.MA_KHANG)
                                 select new
                                 {
                                     p.MA_DVIQLY,
                                     p.MA_KHANG,
                                     p.SO_NHA,
                                     p.DUONG_PHO,
                                     p.DCHI_HDON,
                                     p.ID_HDONG,
                                     p.MASO_THUE,
                                     p.TLE_THUE,
                                     p.LOAI_KHANG,
                                     p.MANHOM_KHANG,
                                     p.MA_NN,
                                     p.TEN_KHANG,
                                     p.TENHDON_KHANG,
                                     p.TENTAT_KHANG,
                                     p.NGAY_SINH,
                                     p.NGAY_HLUC,
                                     p.TRANG_THAI,
                                     p.THANG,
                                     p.NAM,
                                     p.MA_DVIDCHINH,
                                     p.TKHOAN_KHANG,
                                     p.MA_NHANG,
                                     p.MA_KHTT,
                                     p.MA_LOAIDN,
                                     p.DTHOAI,
                                     p.FAX,
                                     p.EMAIL,
                                     p.WEBSITE,
                                     p.GIOI_TINH,
                                     p.NGAY_TAO,
                                     p.NGUOI_TAO,
                                     p.NGAY_SUA,
                                     p.NGUOI_SUA,
                                     p.MA_CNANG
                                 }).ToList();
                if (KHACHHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANGMaxHL = (KHACHHANG.Where(c => c.NGAY_HLUC == KHACHHANG.Where(c2 => c2.MA_KHANG == c.MA_KHANG).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();
                if (KHACHHANGMaxHL.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANGMaxHLChon = (from p in KHACHHANGMaxHL
                                          join m in DDDOSOGCS
                                          on new { p.MA_KHANG } equals new { m.MA_KHANG }
                                          orderby m.STT
                                          select new
                                          {
                                              CHON = false,
                                              m.STT,
                                              p.MA_DVIQLY,
                                              p.MA_KHANG,
                                              p.SO_NHA,
                                              p.DUONG_PHO,
                                              p.DCHI_HDON,
                                              p.ID_HDONG,
                                              p.MASO_THUE,
                                              p.TLE_THUE,
                                              p.LOAI_KHANG,
                                              p.MANHOM_KHANG,
                                              p.MA_NN,
                                              p.TEN_KHANG,
                                              p.TENHDON_KHANG,
                                              p.TENTAT_KHANG,
                                              NGAY_SINH = p.NGAY_SINH == null ? null : p.NGAY_SINH.Value.Date.ToString("dd/MM/yyyy"),
                                              p.NGAY_HLUC,
                                              p.TRANG_THAI,
                                              p.THANG,
                                              p.NAM,
                                              p.MA_DVIDCHINH,
                                              p.TKHOAN_KHANG,
                                              p.MA_NHANG,
                                              p.MA_KHTT,
                                              p.MA_LOAIDN,
                                              p.DTHOAI,
                                              p.FAX,
                                              p.EMAIL,
                                              p.WEBSITE,
                                              p.GIOI_TINH,
                                              p.NGAY_TAO,
                                              p.NGUOI_TAO,
                                              p.NGAY_SUA,
                                              p.NGUOI_SUA,
                                              p.MA_CNANG
                                          }).ToList();

                long[] ArrIDHDONG = KHACHHANGMaxHL.Select(c => c.ID_HDONG).ToArray();

                var HOPDONG = (from p in CMIS2.DB.HDG_HOP_DONG
                               where p.MA_DVIQLY == strMa_dviqly
                               && ArrIDHDONG.Contains(p.ID_HDONG)
                               select p).ToList();

                var HOPDONGMaxHL = (HOPDONG.Where(c => c.NGAY_HLUC == HOPDONG.Where(a => a.ID_HDONG == c.ID_HDONG).Max(s => s.NGAY_HLUC))).ToList();
                if (HOPDONGMaxHL.Count() < 1) { strErr = "Không lấy được thông tin hợp đồng"; return null; }

                var joi1 = (from p in DDDOSOGCS
                            join m in DIEMDOMaxHL
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.STT,
                                p.MA_DVIQLY,
                                p.MA_DDO,
                                m.MA_KHANG,
                                m.DIA_CHI,
                                m.NGAY_HLUC
                            }).ToList();


                var joi2 = (from p in joi1
                            join m in VTDDOMaxHL
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.STT,
                                p.MA_DVIQLY,
                                p.MA_DDO,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.NGAY_HLUC,
                                m.MA_LO,
                                m.MA_TO,
                                m.SO_COT,
                                m.SO_HOM
                            }).ToList();

                var joi3 = (from p in joi2
                            join m in KHACHHANGMaxHL
                            on new { p.MA_KHANG } equals new { m.MA_KHANG }
                            orderby p.STT
                            select new
                            {
                                CHON = false,
                                p.STT,
                                p.MA_DVIQLY,
                                p.MA_DDO,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                NGAY_HLUC = p.NGAY_HLUC.ToString("dd/MM/yyyy"),
                                p.MA_LO,
                                p.MA_TO,
                                p.SO_COT,
                                p.SO_HOM,
                                m.DUONG_PHO,
                                m.DCHI_HDON,
                                m.DTHOAI,
                                m.EMAIL,
                                m.TEN_KHANG
                            }).ToList();

                if (joi3.Count > 0)
                {
                    DataTable dt = Utility.LINQToDataTable(KHACHHANGMaxHLChon);
                    dt.TableName = "KQ";
                    DataSet ds = new DataSet();
                    ds.Tables.Add(dt);

                    DataTable dtDDO = new DataTable();
                    DataTable dtVITRI = new DataTable();
                    DataTable dtKHANG = new DataTable();

                    if (DIEMDOMaxHL.Count > 0)
                    {
                        dtDDO = Utility.LINQToDataTable(DIEMDOMaxHL);
                        dtDDO.TableName = "DIEMDO";
                        ds.Tables.Add(dtDDO);
                    }

                    if (VTDDOMaxHL.Count > 0)
                    {
                        dtVITRI = Utility.LINQToDataTable(VTDDOMaxHL);
                        dtVITRI.TableName = "VITRI";
                        ds.Tables.Add(dtVITRI);
                    }

                    if (KHACHHANGMaxHL.Count > 0)
                    {
                        dtKHANG = Utility.LINQToDataTable(KHACHHANGMaxHL);
                        dtKHANG.TableName = "KHANG";
                        ds.Tables.Add(dtKHANG);
                    }

                    return ds;
                }
                return null;


            }
            catch (Exception ex)
            {
                if (ex.Message.ToString().Contains("ORA-01795"))
                {
                    strErr = "Số điểm đo của sổ lớn hơn 1000, không lấy được dữ liệu !";
                }
                else
                {
                    strErr = "Không lấy được dữ liệu \n" + ex.ToString();
                }
                return null;
            }
        }

        public DataSet Get_THONGTIN_KHANG_tram(string strMa_dviqly, string strMa_tram, ref string strErr)
        {
            try
            {
                //var qddosogcs = (from p in CMIS2.DB.HDG_DDO_SOGCS
                //                 where p.MA_DVIQLY == strMa_dviqly
                //                 && p.MA_SOGCS == strMa_sogcs
                //                 //&& p.NGAY_HLUC == CMIS2.DB.HDG_DDO_SOGCS.Where(c=> c.MA_DDO == p.MA_DDO).Max(c2=> c2.NGAY_HLUC)
                //                 select new
                //                 {
                //                     p.MA_DVIQLY, // = pgroup.Key.MA_DVIQLY,
                //                     p.MA_DDO,  // = pgroup.Key.MA_DDO,
                //                     p.MA_SOGCS,  // = pgroup.Key.MA_SOGCS,
                //                     p.STT,
                //                     p.NGAY_HLUC,
                //                     p.ID_QHE
                //                 }).ToList();
                //if (qddosogcs.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                //string[] ArrDDO = qddosogcs.Select(c => c.MA_DDO).Distinct().ToArray();

                //var DDOinHDG_DDO_SOGCS = (from p in CMIS2.DB.HDG_DDO_SOGCS
                //                          where p.MA_DVIQLY == strMa_dviqly
                //                          && ArrDDO.Contains(p.MA_DDO)
                //                          select p).ToList();

                //var DDOMaxHL = (DDOinHDG_DDO_SOGCS.Where(c => c.NGAY_HLUC == DDOinHDG_DDO_SOGCS.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();

                ////danh sach diem do hien tai thuoc so                               
                //var DDDOSOGCS = (from p in DDOMaxHL
                //                 where p.MA_SOGCS == strMa_sogcs
                //                 select p).ToList();

                var vitri = (from p in CMIS2.DB.HDG_VITRI_DDO
                             where p.MA_DVIQLY == strMa_dviqly
                             && p.MA_TRAM == strMa_tram
                             select p).ToList();

                var vitriMaxID = (vitri.Where(c => c.ID_VITRI_DDO == vitri.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.ID_VITRI_DDO))).ToList();

                string[] ArrMADDO = vitriMaxID.Select(c => c.MA_DDO).Distinct().ToArray();

                if (ArrMADDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                //var nl = ArrMADDO.AsEnumerable();

                var DIEMDO = (from p in CMIS2.DB.HDG_DIEM_DO
                              where p.MA_DVIQLY == strMa_dviqly
                              && ArrMADDO.Contains(p.MA_DDO)
                              select new
                              {
                                  p.MA_DVIQLY,
                                  p.MA_DDO,
                                  p.ID_HDONG,
                                  p.MA_KHANG,
                                  p.MA_DDO_DDIEN,
                                  p.MA_CAPDA,
                                  p.DIA_CHI,
                                  p.ID_DIA_CHINH,
                                  p.KIMUA_CSPK,
                                  p.CSUAT,
                                  p.MUC_DICH,
                                  p.SO_PHA,
                                  p.SOHUU_LUOI,
                                  p.LOAI_DDO,
                                  p.SO_HO,
                                  p.LAN_CAPNHAT,
                                  p.THAO_TACDL,
                                  p.NGAY_HLUC,
                                  p.MO_TA,
                                  p.TRANG_THAI,
                                  p.TTRANG_TREOTHAO,
                                  p.NGAY_TAO,
                                  p.NGUOI_TAO,
                                  p.NGAY_SUA,
                                  p.NGUOI_SUA,
                                  p.MA_CNANG
                              }).ToList();

                if (DIEMDO.Count() < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }

                var DIEMDOMaxHL1 = (DIEMDO.Where(c => c.NGAY_HLUC == DIEMDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();

                var DIEMDOMaxHL = (DIEMDOMaxHL1.Where(c => c.LAN_CAPNHAT == DIEMDOMaxHL1.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.LAN_CAPNHAT))).ToList();
                if (DIEMDOMaxHL.Count < 1) { strErr = "Không lấy được danh sách điểm đo"; return null; }


                var VTDDO = (from p in CMIS2.DB.HDG_VITRI_DDO
                             where p.MA_DVIQLY == strMa_dviqly
                             && ArrMADDO.Contains(p.MA_DDO)
                             select new
                             {
                                 p.MA_DVIQLY,
                                 p.ID_VITRI_DDO,
                                 p.NGAY_HLUC,
                                 p.MA_DDO,
                                 p.MA_TRAM,
                                 p.MA_LO,
                                 p.MA_TO,
                                 p.PHA,
                                 p.SO_COT,
                                 p.SO_HOM,
                                 p.NGAY_TAO,
                                 p.NGUOI_TAO,
                                 p.NGAY_SUA,
                                 p.NGUOI_SUA,
                                 p.MA_CNANG
                             }).ToList();

                var VTDDOMaxHL = (VTDDO.Where(c => c.NGAY_HLUC == VTDDO.Where(c2 => c2.MA_DDO == c.MA_DDO).Max(c3 => c3.NGAY_HLUC))).ToList();
                if (VTDDOMaxHL.Count() < 1) { strErr = "Không lấy được vị trí điểm đo"; return null; }


                string[] ArrMAKHANG = DIEMDOMaxHL.Select(c => c.MA_KHANG).Distinct().ToArray();
                if (ArrMAKHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANG = (from p in CMIS2.DB.HDG_KHACH_HANG
                                 where p.MA_DVIQLY == strMa_dviqly
                                 && ArrMAKHANG.Contains(p.MA_KHANG)
                                 select new
                                 {
                                     p.MA_DVIQLY,
                                     p.MA_KHANG,
                                     p.SO_NHA,
                                     p.DUONG_PHO,
                                     p.DCHI_HDON,
                                     p.ID_HDONG,
                                     p.MASO_THUE,
                                     p.TLE_THUE,
                                     p.LOAI_KHANG,
                                     p.MANHOM_KHANG,
                                     p.MA_NN,
                                     p.TEN_KHANG,
                                     p.TENHDON_KHANG,
                                     p.TENTAT_KHANG,
                                     p.NGAY_SINH,
                                     p.NGAY_HLUC,
                                     p.TRANG_THAI,
                                     p.THANG,
                                     p.NAM,
                                     p.MA_DVIDCHINH,
                                     p.TKHOAN_KHANG,
                                     p.MA_NHANG,
                                     p.MA_KHTT,
                                     p.MA_LOAIDN,
                                     p.DTHOAI,
                                     p.FAX,
                                     p.EMAIL,
                                     p.WEBSITE,
                                     p.GIOI_TINH,
                                     p.NGAY_TAO,
                                     p.NGUOI_TAO,
                                     p.NGAY_SUA,
                                     p.NGUOI_SUA,
                                     p.MA_CNANG
                                 }).ToList();
                if (KHACHHANG.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                var KHACHHANGMaxHL = (KHACHHANG.Where(c => c.NGAY_HLUC == KHACHHANG.Where(c2 => c2.MA_KHANG == c.MA_KHANG).Max(c3 => c3.NGAY_HLUC) && c.TRANG_THAI == 1)).ToList();
                if (KHACHHANGMaxHL.Count() < 1) { strErr = "Không lấy được danh sách khách hàng"; return null; }

                long[] ArrIDHDONG = KHACHHANGMaxHL.Select(c => c.ID_HDONG).ToArray();

                var HOPDONG = (from p in CMIS2.DB.HDG_HOP_DONG
                               where p.MA_DVIQLY == strMa_dviqly
                               && ArrIDHDONG.Contains(p.ID_HDONG)
                               select p).ToList();

                var HOPDONGMaxHL = (HOPDONG.Where(c => c.NGAY_HLUC == HOPDONG.Where(a => a.ID_HDONG == c.ID_HDONG).Max(s => s.NGAY_HLUC))).ToList();
                if (HOPDONGMaxHL.Count() < 1) { strErr = "Không lấy được thông tin hợp đồng"; return null; }

                var joi1 = (from p in vitriMaxID
                            join m in DIEMDOMaxHL
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.MA_DVIQLY,
                                p.MA_DDO,
                                m.MA_KHANG,
                                m.DIA_CHI,
                                m.NGAY_HLUC
                            }).ToList();


                var joi2 = (from p in joi1
                            join m in VTDDOMaxHL
                            on new { p.MA_DDO } equals new { m.MA_DDO }
                            select new
                            {
                                p.MA_DVIQLY,
                                p.MA_DDO,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.NGAY_HLUC,
                                m.MA_LO,
                                m.MA_TO,
                                m.SO_COT,
                                m.SO_HOM
                            }).ToList();

                var joi3 = (from p in joi2
                            join m in KHACHHANGMaxHL
                            on new { p.MA_KHANG } equals new { m.MA_KHANG }
                            orderby p.MA_DDO
                            select new
                            {
                                CHON = false,
                                p.MA_DVIQLY,
                                p.MA_DDO,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.NGAY_HLUC,
                                p.MA_LO,
                                p.MA_TO,
                                p.SO_COT,
                                p.SO_HOM,
                                m.DUONG_PHO,
                                m.DCHI_HDON,
                                m.DTHOAI,
                                m.EMAIL,
                                m.TEN_KHANG
                            }).ToList();





                /*
                var joi7 = (from p in joi5
                            join m in CTO
                            on new { p.MA_DVIQLY, p.MA_CTO } equals new { m.MA_DVIQLY, m.MA_CTO }
                            orderby p.STT
                            select new
                            {
                                CHON = false,
                                p.MA_DDO,
                                p.MA_DVIQLY,
                                p.MA_SOGCS,
                                p.STT,
                                p.MA_KHANG,
                                p.DIA_CHI,
                                p.SO_HO,
                                p.TEN_KHANG,
                                p.ID_HDONG,
                                p.CHUOI_GIA,
                                p.DINH_MUC,
                                KY = p.KY.ToString(),
                                THANG = p.THANG.ToString(),
                                NAM = p.NAM.ToString(),
                                p.CHISO_MOI,
                                p.CHISO_CU,
                                p.LOAI_CHISO,
                                p.BCS,
                                p.HS_NHAN,
                                p.MA_CTO,
                                p.SO_CTO,
                                p.MA_LO,
                                p.MA_TO,
                                p.MA_TRAM,
                                PHA = p.SO_PHA.ToString(),
                                CSUAT_DDO = p.CSUAT.ToString(),
                                p.SO_COT,
                                p.SO_HOM,
                                HSN = p.HS_NHAN,
                                PHA_ABCD = p.PHA,
                                MA_NHOMNN = p.MA_NN,
                                m.MA_CLOAI,
                                m.NAM_SX,
                                m.LOAI_SOHUU,
                                NGAY_BDONG = m.NGAY_BDONG == null ? null : m.NGAY_BDONG.Value.ToString("dd/MM/yyyy"),
                                HAN_KDINH = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HAN_KDINH).FirstOrDefault(),
                                NGAY_KDINH = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault(),
                                MA_NUOC = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.MA_NUOC).FirstOrDefault(),
                                SO_CSO = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.SO_CSO).FirstOrDefault(),
                                DONG_DIEN = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.DONG_DIEN).FirstOrDefault(),
                                HANGSO_K = HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HANGSO_K).FirstOrDefault() == null ? null : HANKDINH.Where(c => c.MA_CTO == p.MA_CTO).Select(c2 => c2.HANGSO_K).FirstOrDefault(),
                                TEN_TO = TO.Where(c => c.MA_TO == p.MA_TO).Select(c2 => c2.TEN_TO).FirstOrDefault(),
                                TEN_LO = LO.Where(c => c.MA_LO == p.MA_LO).Select(c2 => c2.TEN_LO).FirstOrDefault(),
                                TEN_TRAM = TRAM.Where(c => c.MA_TRAM == p.MA_TRAM).Select(c2 => c2.TEN_TRAM).FirstOrDefault(),
                                CSUAT_TRAM = TRAM.Where(c => c.MA_TRAM == p.MA_TRAM).Select(c2 => c2.CSUAT_TRAM).FirstOrDefault().ToString(),
                                MA_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.MA_HDONG).FirstOrDefault(),
                                NGAYKY_HDONG = HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault() == null ? null : HOPDONGMaxHL.Where(c => c.ID_HDONG == p.ID_HDONG).Select(a => a.NGAYKY_HDONG).FirstOrDefault().Value.ToString("dd/MM/yyyy"),
                                CAP_DAP = CAPDAP.Where(c => c.MA_DDO == p.MA_DDO).Select(a => a.TEN_CAPDA).FirstOrDefault(),
                                TYSO_TU = TUmaxID == null ? null : (TUmaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault() == null ? null : TUmaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault()),
                                NGAY_KDINH_TU = TUKdinh == null ? null : (TUKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault() == null ? null : TUKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault().Value.ToString("dd/MM/yyyy")),
                                TYSO_TI = TImaxID == null ? null : (TImaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault() == null ? null : TImaxID.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.TYSO_DAU).FirstOrDefault()),
                                NGAY_KDINH_TI = TIKdinh == null ? null : (TIKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault() == null ? null : TIKdinh.Where(c => c.MA_DDO == p.MA_DDO).Select(c2 => c2.NGAY_KDINH).FirstOrDefault().Value.ToString("dd/MM/yyyy"))

                            }).ToList();

                */


                if (joi3.Count > 0)
                {
                    DataTable dt = Utility.LINQToDataTable(joi3);
                    dt.TableName = "KQ";
                    DataSet ds = new DataSet();
                    ds.Tables.Add(dt);

                    DataTable dtDDO = new DataTable();
                    DataTable dtVITRI = new DataTable();
                    DataTable dtKHANG = new DataTable();

                    if (DIEMDOMaxHL.Count > 0)
                    {
                        dtDDO = Utility.LINQToDataTable(DIEMDOMaxHL);
                        dtDDO.TableName = "DIEMDO";
                        ds.Tables.Add(dtDDO);
                    }

                    if (VTDDOMaxHL.Count > 0)
                    {
                        dtVITRI = Utility.LINQToDataTable(VTDDOMaxHL);
                        dtVITRI.TableName = "VITRI";
                        ds.Tables.Add(dtVITRI);
                    }

                    if (KHACHHANGMaxHL.Count > 0)
                    {
                        dtKHANG = Utility.LINQToDataTable(KHACHHANGMaxHL);
                        dtKHANG.TableName = "KHANG";
                        ds.Tables.Add(dtKHANG);
                    }

                    return ds;
                }
                return null;


            }
            catch (Exception ex)
            {
                if (ex.Message.ToString().Contains("ORA-01795"))
                {
                    strErr = "Số điểm đo của sổ lớn hơn 1000, không lấy được dữ liệu !";
                }
                else
                {
                    strErr = "Không lấy được dữ liệu \n" + ex.ToString();
                }
                return null;
            }
        }


    }
}
